package org.sam.swing.builder;

import java.awt.Component;
import java.awt.Container;

/**
 * 固定一个标签，一个编辑控件实现的抽象基类
 * @author sam
 *
 */
public abstract class AbstractFixedLayoutBuilder implements LayoutBuilder {
	
	/**
	 * 固定一个标签，一个编辑控件实现的抽象基类
	 * @param parent
	 */
	public AbstractFixedLayoutBuilder(Container parent){
		super();
		this.setParent(parent);
	}

	/**
	 * 右侧空闲位置
	 */
	protected int rightSpace = 10;
	/**
	 * y轴起始坐标
	 */
	private int yBaseLine = 5;
	/**
	 * 标签控件的x轴起始位置
	 */
	protected int xLabelLine = 10;
	/**
	 * 编辑控件的x起始位置
	 */
	protected int xEditorLine = 88;
	/**
	 * 控件高度
	 */
	protected int editorHeight = 28;
	/**
	 * 标签宽度
	 */
	protected int lblWidth = 80;
	/**
	 * 每行控件的间隔
	 */
	private int interval = 7;
	/**
	 * y轴的偏移量,用来让后边的操作控件和lable视觉居中
	 */
	protected int offset = 3;
	/**
	 * 当前操作的父容器对象
	 */
	protected Container parent;
	
	/**
	 * 右侧空闲位置
	 * 
	 * @return
	 */
	public int getRightSpace() {
		return rightSpace;
	}

	/**
	 * 右侧空闲位置
	 * 
	 * @param rightSpace
	 */
	public void setRightSpace(int rightSpace) {
		this.rightSpace = rightSpace;
	}

	/**
	 * y轴起始坐标
	 * 
	 * @return
	 */
	public int getyBaseLine() {
		return yBaseLine;
	}

	/**
	 * y轴起始坐标
	 * 
	 * @param yBaseLine
	 */
	public void setyBaseLine(int yBaseLine) {
		this.yBaseLine = yBaseLine;
	}

	/**
	 * 标签控件的x轴起始位置
	 * 
	 * @return
	 */
	public int getxLabelLine() {
		return xLabelLine;
	}

	/**
	 * 标签控件的x轴起始位置
	 * 
	 * @param xLabelLine
	 */
	public void setxLabelLine(int xLabelLine) {
		this.xLabelLine = xLabelLine;
	}

	/**
	 * 标签控件的x轴起始位置
	 * 
	 * @return
	 */
	public int getxEditorLine() {
		return xEditorLine;
	}

	/**
	 * 标签控件的x轴起始位置
	 * 
	 * @param xEditorLine
	 */
	public void setxEditorLine(int xEditorLine) {
		this.xEditorLine = xEditorLine;
	}

	/**
	 * 控件高度
	 * 
	 * @return
	 */
	public int getEditorHeight() {
		return editorHeight;
	}

	/**
	 * 控件高度
	 * 
	 * @param editorHeight
	 */
	public void setEditorHeight(int editorHeight) {
		this.editorHeight = editorHeight;
	}

	/**
	 * 标签宽度
	 * 
	 * @return
	 */
	public int getLblWidth() {
		return lblWidth;
	}

	/**
	 * 标签宽度
	 * 
	 * @param lblWidth
	 */
	public void setLblWidth(int lblWidth) {
		this.lblWidth = lblWidth;
	}

	/**
	 * 每行控件的间隔
	 * 
	 * @return
	 */
	public int getInterval() {
		return interval;
	}

	/**
	 * 每行控件的间隔
	 * 
	 * @param interval
	 */
	public void setInterval(int interval) {
		this.interval = interval;
	}

	/**
	 * y轴的偏移量,用来让后边的操作控件和lable视觉居中
	 * 
	 * @return
	 */
	public int getOffset() {
		return offset;
	}

	/**
	 * y轴的偏移量,用来让后边的操作控件和lable视觉居中
	 * 
	 * @param offset
	 */
	public void setOffset(int offset) {
		this.offset = offset;
	}

	/**
	 * 当前的y控件基线
	 */
	protected int yLine = -1;

	/**
	 * {@inheritDoc}
	 */
	@Override
	public Container getParent() {
		return this.parent;
	}

	/**
	 * {@inheritDoc}
	 */
	@Override
	public void setParent(Container parent) {
		if (parent == null)
			throw new RuntimeException("parent container is null");
	
		if (this.parent == parent)
			return;
	
		this.parent = parent;
		this.init();
	}
	
	/**
	 * 初始化一些数据的操作
	 * @return
	 */
	protected abstract void init();

	/**
	 * 获取并设置下一条y基准线
	 * 
	 * @return
	 */
	protected int getAndSetNextYLine() {
		if (this.yLine < 0)
			this.yLine = this.yBaseLine;
		else
			this.yLine = this.yLine + this.editorHeight + this.interval;
	
		return this.yLine;
	}

	/**
	 * {@inheritDoc}
	 */
	@Override
	public void buildAll(Component... components) {
		
		if (components == null || components.length == 0 || components.length % 2 != 0)
			throw new RuntimeException("not support components length");
	
		for (int i = 0; i < components.length - 2; i += 2) {
			this.append(components[i], components[i + 1]);
		}
	}

}